package Thread;
/**类级别的锁*/

/*在这段代码中，synchronized (demo15_3.class) 是使用类对象作为锁。
当两个线程（t1 和 t2）尝试进入 synchronized 块时，它们都会试图获取
同一个锁对象（即 demo15_3.class）。由于这是同一个锁，所以当一个线程已经
获得了锁并正在执行 synchronized 块内的代码时，另一个线程必须等待，
直到前一个线程释放锁。这种方式保证了 count++ 操作的原子性，
从而避免了竞态条件（race condition），确保最终的 count 值为 100000。*/

/*如果只需要一个简单的锁，并且这个锁需要作用于整个类的所有实例，那么使用类级别的锁是合适的。
如果需要更细粒度的控制，或者希望减少不必要的线程阻塞，使用专门的 Object 锁可能是一个更好的选择。*/

public class demo15_3 {
    private static int count = 0;

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                synchronized (demo15_3.class) {
                    count++;
                }
            }
            System.out.println("t1结束");
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                synchronized (demo15_3.class) {
                    count++;
                }
            }
            System.out.println("t2结束");
        });

        t1.start();
        t2.start();

        t1.join();
        t2.join();

        System.out.println(count);
    }
}